package com.piao.springbootunifiedresult.common.Exception;

import com.piao.springbootunifiedresult.common.Result.ResultCodeEnum;
import lombok.Data;

/**
 * 自定义全局异常类
 *
 * 统一异常处理
 * 使用统一返回结果时，还有一种情况，就是程序的保存是由于运行时异常导致的结果，有些异常我们可以无法提前预知，不能正常走到我们return的R对象返回。
 * 因此，我们需要定义一个统一的全局异常来捕获这些信息，并作为一种结果返回控制层
 * @ControllerAdvice
 * 该注解为统一异常处理的核心
 * 是一种作用于控制层的切面通知（Advice），该注解能够将通用的@ExceptionHandler、@InitBinder和@ModelAttributes方法收集到一个类型，并应用到所有控制器上
 * 该类中的设计思路：
 * 使用@ExceptionHandler注解捕获指定或自定义的异常；
 * 使用@ControllerAdvice集成@ExceptionHandler的方法到一个类中；
 * 必须定义一个通用的异常捕获方法，便于捕获未定义的异常信息；
 * 自定一个异常类，捕获针对项目或业务的异常;
 * 异常的对象信息补充到统一结果枚举中；
 */
@Data
public class CMSException extends RuntimeException {
    private Integer code;

    public CMSException(Integer code, String message) {
        super(message);
        this.code = code;
    }

    public CMSException(ResultCodeEnum resultCodeEnum) {
        super(resultCodeEnum.getMessage());
        this.code = resultCodeEnum.getCode();
    }

    @Override
    public String toString() {
        return "CMSException{" + "code=" + code + ", message=" + this.getMessage() + '}';
    }
}
